﻿// Inner Fire 游戏引擎库
// DxPostProcessing 渲染器后处理功能
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于DirectX的渲染器。
// 此文件分装后处理功能
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-23

#pragma once

#include <dx/texture/render_target.h>
#include <dx/texture/sobel_filter.h>
#include <dx/texture/ssao.h>

namespace ifire::dx {
class DxGraphics;

class DxPostProcessing {
public:
  DxPostProcessing(DxGraphics* dx);
  DxPostProcessing(const DxPostProcessing& rhs) = delete;
  DxPostProcessing& operator=(const DxPostProcessing& rhs) = delete;
  ~DxPostProcessing() = default;

  // 初始化配置
  void InitConfig();
  // 初始化
  void Init();
  // 重置
  void Reset();

  // ------
  // 属性访问
  // ------
  RenderTarget* GetOffscreenRt() { return offscreen_rt_.get(); }
  SobelFilter* GetSobel() { return sobel_filter_.get(); }
  Ssao* GetSsao() { return ssao_.get(); }
  bool GetSsaoEnable() const { return ssao_enable; }
  bool GetSobelEnable() const { return sobel_enable_; }

private:
  // 用于SSAO
  std::unique_ptr<Ssao> ssao_;
  // 用于模糊
  std::unique_ptr<RenderTarget> offscreen_rt_ = nullptr;
  // 索贝尔算子
  std::unique_ptr<SobelFilter> sobel_filter_ = nullptr;
  // 是否启用索贝尔算子
  bool sobel_enable_ = false;
  // 是否启用SSAO
  bool ssao_enable = false;

  // 主渲染类
  DxGraphics* dx_;
};

} // namespace ifire::dx